# Função para instalação e carregamento de pacotes
install_and_load <- function(package) {
  if (!requireNamespace(package, quietly = TRUE)) install.packages(package)
  library(package, character.only = TRUE)
}

# Instalação e carregamento dos pacotes
packages_to_install <- c(
  "haven",
  "sjlabelled",
  "jtools",
  "memisc",
  "ggplot2",
  "ggstance",
  "magrittr",
  "ggeffects",
  "sjmisc",
  "lme4",
  "splines",
  "nnet",
  "sjPlot"
)

invisible(lapply(packages_to_install, install_and_load))

## Importação do banco
DF <- read_sav("Seg.SAV") # o usuário deve incluir o diretório onde está
                          # o banco de dados Seg.SAV em sua máquina, como 
                          # no exemplo: 
                          # DF <- read_sav("~/Library/CloudStorage/OneDrive-Pessoal/
                          # 2023/Ambientalismo e voto/Seg.SAV")

DF <- remove_all_labels(DF) # remove os rótulos importados do formato SAV
                            # para uso da função recode

# Recodificação da variável dependente 
DF$Vote <- recode(DF$estimuA, "Bolsonaro" <- 3, "Lula da Silva" <- 6, 
                  "Ciro" <- 1, "Others" <- c(4,12,96,99))

# Recodificação da variável independente de saliência
DF$Sali <- recode(DF$p5n, 1 <- 1, 2 <- 2, 3 <- 3, 4 <- 4,
                  5 <- 5, 6 <- 6, 7 <- 7, 8 <- 8, 9 <-9,
                  10 <- 10, NA <- c(96, 99))
DF$Sali <- recode(DF$p5n, 1 <- 10, 0 <- c(1:9), NA <- c(96, 99))
DF$Sali <- as.factor(DF$Sali)
DF$Sali <- as.factor(DF$Sali)

# Recodificação da variável independente de propriedade
DF$Ownership <- recode(DF$p6n, "Bolsonaro" <- 3, "Lula da Silva" <- 6, 
                       "Ciro" <- 1, "Others" <- c(4,8,9,10,11,12,13),
                       NA <- c(95,96,99))

## Controles para o modelo multivariado final
DF$Sexo <- recode(DF$SEXO, "Masculino" <- 1, "Feminino" <- 2)

DF$EconSoc <- recode(DF$p21A, "Positiva" <- 1, "Neutra" <- 3, "Negativa" <- 2,
                     NA <- 99)

DF$Cor <- recode(DF$COR, "Branco" <- 1, "Não Branco" <- c(2, 3, 4, 5, 98))

DF$Relig <- recode(DF$RELIGIAO_1, "Católica" <- 4,
                   "Evangélica" <- c(6, 60:76), "Africanas" <- c(3, 12),
                   "Outras" <- c(1,2,5,7,8,9,10,11,13,98), "Sem religião" <- 96,
                   NA <- 99)

DF$EscolN <- recode(DF$ESCOLA, "Até Fund. Incompleto" <- c(1:2),
                    "Fund. Completo" <- 3, "Médio Incompleto" <- 4,
                    "Médio Completo" <- 5, "Sup. Incompleto" <- 6,
                    "Superior ou Pós" <- c(7,8))

DF$EscolS <- recode(DF$ESCOLA, 0 <- c(1:6),
                    "Superior ou Pós" <- c(7,8))

DF$RendN <- recode(DF$RENDAF, 1 <- 9, 2 <- 1, 3 <- 2, 4 <- 3, 5 <- 4,
                   6 <- 5, 7 <- 6, 8 <- 7, NA <- c(99, 97))

## Modelos
# Modelo logístico multinomial usando a variável independente de saliência
VotoAmb.Sali <- multinom(Vote ~ Sali, data = DF)

# Modelo logístico multinomial usando a variável independente de propriedade
VotoAmb.Prop <- multinom(Vote ~ Ownership, data = DF)

# Modelo logístico multinomial para as duas variáveis independentes
VotoAmb.SaliProp <- multinom(Vote ~ Sali + Ownership, data = DF)

# Organiza os resultados dos três modelos em tabelas
tab_model(VotoAmb.Sali)
tab_model(VotoAmb.Prop)
tab_model(VotoAmb.SaliProp)

# Apresenta os resultados do modelo usando saliência em gráfico
VotoAmb <- broom::tidy(VotoAmb.Sali,conf.int=TRUE)
VotoAmb <- dplyr::filter(VotoAmb, term!="(Intercept)")
VotoAmb$Vote <- VotoAmb$y.level
ggplot(VotoAmb, aes(x=estimate,y=term,colour=Vote))+
  geom_pointrange(aes(xmin=conf.low,
                      xmax=conf.high),
                  position=position_dodgev(height=0.75))+
  xlab("Coefficient")+
  ylab("Predictors")+
  scale_y_discrete(labels= c("Salience")) + 
  theme(text = element_text(family = "Cambria", size = 11),
        legend.text = element_text(size = 11),
        legend.title = element_text(size = 11))

# Apresenta os resultados do modelo usando propriedade em gráfico
VotoAmb <- broom::tidy(VotoAmb.Prop,conf.int=TRUE)
VotoAmb <- dplyr::filter(VotoAmb, term!="(Intercept)")
VotoAmb$Vote <- VotoAmb$y.level
ggplot(VotoAmb, aes(x=estimate,y=term,colour=Vote))+
  geom_pointrange(aes(xmin=conf.low,
                      xmax=conf.high),
                  position=position_dodgev(height=0.75))+
  xlab("Coefficient")+
  ylab("Predictors")+
  scale_y_discrete(labels= c("Ownership=Ciro",
                             "Ownership=Lula", 
                             "Ownership=Others",
                             "Salience")) +
  theme(text = element_text(family = "Cambria", size = 11),
        legend.text = element_text(size = 11),
        legend.title = element_text(size = 11))


# Apresenta os resultados do modelo usando as duas variáveis em gráfico
VotoAmb <- broom::tidy(VotoAmb.SaliProp,conf.int=TRUE)
VotoAmb <- dplyr::filter(VotoAmb, term!="(Intercept)")
VotoAmb$Vote <- VotoAmb$y.level
ggplot(VotoAmb, aes(x=estimate,y=term,colour=Vote))+
  geom_pointrange(aes(xmin=conf.low,
                      xmax=conf.high),
                  position=position_dodgev(height=0.75))+
  xlab("Coefficient")+
  ylab("Predictors")+
  scale_y_discrete(labels= c("Ownership=Ciro",
                             "Ownership=Lula", 
                             "Ownership=Others",
                             "Salience")) + 
  theme(text = element_text(family = "Cambria", size = 11),
        legend.text = element_text(size = 11),
        legend.title = element_text(size = 11))


# Calcula as probabilidades preditas considerando as duas variáveis e apresenta
# em gráfico
PredModVoto <- ggpredict(VotoAmb.SaliProp, terms = c("Sali", "Ownership"), ci.lvl = .95)
p <- plot(PredModVoto) +
  theme(text = element_text(family = "Cambria", size = 11),
        legend.text = element_text(size = 11),
        legend.title = element_text(size = 11))

p + ggtitle("") +
  xlab("Salience") + ylab("Predicted Likelihood")

# Modelo logístico multinomial para as duas variáveis independentes incluindo controles
VotoAmb.Contr <- multinom(Vote ~ Sali + Ownership + 
                            EconSoc + FX_ID +
                            DF$EscolS + 
                            Sexo+
                            Relig, data = DF)

# Organiza os resultados desse modelo em tabela
tab_model(VotoAmb.Contr)

# Apresenta os resultados desse modelo em gráfico
VotoAmb <- broom::tidy(VotoAmb.Contr,conf.int=TRUE)
VotoAmb <- dplyr::filter(VotoAmb, term!="(Intercept)")
VotoAmb$Vote <- VotoAmb$y.level
ggplot(VotoAmb, aes(x=estimate,y=term,colour=Vote))+
  geom_pointrange(aes(xmin=conf.low,
                      xmax=conf.high),
                  position=position_dodgev(height=1.00))+
  xlab("Coefficient")+
  ylab("Predictors")+
  scale_y_discrete(labels= c("Higher education",
                             "Negative assessment of the economy",
                             "Neutral assessment of the economy",
                             "Age group",
                             "Ownership = Ciro Gomes",
                             "Ownership = Lula da Silva", 
                             "Ownership = Others",
                             "African-Brazilian religions",
                             "Evangelical",
                             "Other religions",
                             "Atheist",
                             "Issue salience",
                             "Gender")) +
  theme(text = element_text(family = "Cambria", size = 11),
        legend.text = element_text(size = 11),
        legend.title = element_text(size = 11))





